iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
Software Development

LeetCode-30 Days of JavaScript系列 第 23

LeetCode JS30-Day23 | 2631. Group By 分組

  • 分享至 

  • xImage
  •  

LeetCode JS30-Day23 | 2631. Group By

Description❓

Write code that enhances all arrays such that you can call the array.groupBy(fn) method on any array and it will return a grouped version of the array.

A grouped array is an object where each key is the output of fn(arr[i]) and each value is an array containing all items in the original array with that key.

The provided callback fn will accept an item in the array and return a string key.

The order of each value list should be the order the items appear in the array. Any order of keys is acceptable.

Please solve it without lodash's _.groupBy function.

編寫代碼以擴充所有陣列通用屬性或方法,以便可以在任何陣列上呼叫函數array.groupBy(fn),並且回傳該陣列的分組版本。

分組陣列是一個 每個鍵都是fn(arr[i])的輸出,且每個值都是一個陣列,其中包含原始陣列中具有該鍵的所有項目。

以陣列中元素作為參數呼叫回調函數fn將回傳一個字串作為鍵(string key)。

分組陣列中的值列表順序應該是項目在陣列中出現的順序,而鍵任何排序都是可接受的。

請在沒有 lodash 的 _.groupBy 函數的情況下解決它。

Points

Solution✍️

[ ▶️挑戰這一題 ][ 本日代碼 ]

思路 -跑for迴圈檢查分組存不存在相同的鍵

  1. 擴充陣列方法“array.groupBy(fn)”,並且它將返回數組的分組版本,
    分組數組是一個對象,其中每個鍵都是“fn(arr[i])”的輸出,每個值都是一個包含原始數組中具有該鍵的所有項目的數組。

    Array.prototype.groupBy = function(fn) {
    const grouped = {};
    //分組邏輯
    return grouped
    };
    
  2. 試想一下
    grouped應該具有鍵值對,根據 fn(element)的返回結果作為Key,而value則為element

    Input: 
    array = [{"id":"1"},{"id":"1"},{"id":"2"}], 
    fn = function (item) { return item.id;   }
    
    Output: 
    { 
        "1": [{"id": "1"}, {"id": "1"}],   
        "2": [{"id": "2"}] 
    }
    
  3. 分組邏輯:使用迴圈遍歷原始陣列的元素,
    確認返回物件中 fn(element)的鍵是否存在,如果不存在則grouped[key]賦值為空陣列[]

  4. 把原始陣列元素push到對應的grouped[key]內,完成分組。
    array = [{"id":"1"},{"id":"1"},{"id":"2"}],
    fn = function (item) { return item.id; }

    Array.prototype.groupBy = function(fn) {
    const grouped = {};
    
    /* 分組邏輯
    * object[key] 訪問屬性,如果不存在則grouped[key]賦值為空陣列[]
    * 接著把原始陣列元素push到對應的grouped[key]內
    * 舉例
    * key = fn({"id":"1"}) = 1
    * grouped[1]不存在的話  {"1":[]}
    * grouped[1].push(e)  {"1":[{"id":"1"},...]}
    */    
    for(let e of this){
        const key = fn(e);
        grouped[key] || (grouped[key] = []);
        //於 if (!grouped[key]) { grouped[key] = [];}
        grouped[key].push(e);
    }
    return grouped
    };
    

Testcase

let array1 = [
  {"id":"1"},
  {"id":"1"},
  {"id":"2"}
];
let fn1 = function (item) { 
  return item.id; 
}
const result1 = array1.groupBy(fn1);
console.log(JSON.stringify(result1));
//Output
// {"1":[{"id":"1"},{"id":"1"}],"2":[{"id":"2"}]}
let array2 = [
  [1, 2, 3],
  [1, 3, 5],
  [1, 5, 9]
];
let fn2 = function (list) { 
  return String(list[0]); 
}
const result2 = array2.groupBy(fn2);
console.log(JSON.stringify(result2));
//Output
// {"1":[[1,2,3],[1,3,5],[1,5,9]]}
let array3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let fn3 = function (n) { 
  return String(n > 5);
}
const result3 = array3.groupBy(fn3);
console.log(JSON.stringify(result3));
//Output
// {"false":[1,2,3,4,5],"true":[6,7,8,9,10]}

上一篇
LeetCode JS30-Day22 | 2619. Array Prototype Last 陣列原型的Last方法
下一篇
LeetCode JS30-Day24 | 2724. Sort By 排序
系列文
LeetCode-30 Days of JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言